/*
 * CodeContextLine.java	 
 *
 * Copyright 2008 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 07/10/08, 11:23:38 AM
 */
package com.ufps.cuatro.util.generadores.codeobject;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * <i><b>CodeContextLine:</b></i><p>Esta Clase representa una linea de Código Fuente
 * en el Contexto de Generación de Código de la Aplicación.</p>
 * <p>El Contexto de Generación de Código se refiere a las estructuras que
 * representan las Interfaces Graficas Generadas.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/08
 * @see CodeContext
 */
public class CodeContextLine extends CodeContext{    
    
    private String strLine;
    private HashMap<String, String> objTokensLine;
    private ArrayList<CodeContextLine> objInternCode;

    /**
     * Constructor por Defecto.
     */
    public CodeContextLine() {
        strLine = "";
        objTokensLine = new HashMap<String, String>();
        objInternCode = new ArrayList<CodeContextLine>();
    }

    /**
     * Constructor que Inicializa el Contexto que Representa la Linea de Código
     * Fuente.
     * @param strLine Contexto que Representa la Linea de Código
     * Fuente.
     */
    public CodeContextLine(String strLine) {
        this.strLine = strLine;
        objTokensLine = new HashMap<String, String>();
        objInternCode = new ArrayList<CodeContextLine>();
    }

    /**
     * Devuelve el Contexto que Representa la Linea de Código
     * Fuente.
     * @return Contexto que Representa la Linea de Código
     * Fuente.
     */
    public String getStrLine() {
        return strLine;
    }

    /**
     * Establece el Contexto que Representa la Linea de Código
     * Fuente.
     * @param strLine Contexto que Representa la Linea de Código
     * Fuente.
     */
    public void setStrLine(String strLine) {
        this.strLine = strLine;
    }
    
    /**
     * Adiciona una Sentencia al Contexto que Representa la Linea de Código
     * Fuente.
     * @param key Nombre de la Sentencia.
     * @param value Valor de la Sentencia.
     */
    public void addElement(String key, String value){
        objTokensLine.put(key, value);
    }
    
    /**
     * Devuelve el Valor de una Sentencia representada en el Parametro recibido.
     * @param key Nombre de la Sentencia.
     * @return Valor de la Sentencia.
     */
    public String getElement(String key){
        return objTokensLine.get(key);
    }

    /**
     * Devuelve el Mapa que Representa el Contexto de la Linea de Código
     * Fuente.
     * @return Mapa que Representa el Contexto de la Linea de Código
     * Fuente.
     */
    public HashMap<String, String> getObjTokensLine() {
        return objTokensLine;
    }

    /**
     * Establece el Mapa que Representa el Contexto de la Linea de Código
     * Fuente. 
     * @param objTokensLine Mapa que Representa el Contexto de la Linea de Código
     * Fuente.
     */
    public void setObjTokensLine(HashMap<String, String> objTokensLine) {
        this.objTokensLine = objTokensLine;
    }
    
    /**
     * Determina si la Linea esta Vacía.
     */
    public boolean isEmpty(){
        return strLine.isEmpty() && objTokensLine.isEmpty() && objInternCode.isEmpty();
    }

    @Override
    public String toString() {
        if(!strLine.isEmpty()){
            return strLine;
        }
        else if(!objTokensLine.isEmpty()){
            return "Linea divida en Tokens: " + objTokensLine.toString();
        }
        else if(!objInternCode.isEmpty()){
            return "Secuencia Interna: " + objInternCode.toString();
        }
        return "//Error Linea Vacía: ref. " + super.toString();
    }

    @Override
    @SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
    public boolean equals(Object obj) {
        return this.strLine.equals(String.valueOf(obj));
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 79 * hash + (this.strLine != null ? this.strLine.hashCode() : 0);
        hash = 79 * hash + (this.objTokensLine != null ? this.objTokensLine.hashCode() : 0);
        hash = 79 * hash + (this.objInternCode != null ? this.objInternCode.hashCode() : 0);
        return hash;
    }    

    /**
     * Devuelve el Contexto Interno asociado al Contexto que Representa la Linea de Código
     * Fuente.
     * @return Contexto Interno asociado al Contexto que Representa la Linea de Código
     * Fuente.
     */
    public ArrayList<CodeContextLine> getObjInternCode() {
        return objInternCode;
    }

    /**
     * Establece el Contexto Interno asociado al Contexto que Representa la Linea de Código
     * Fuente.
     * @param objInternCode Contexto Interno asociado al Contexto que Representa la Linea de Código
     * Fuente.
     */
    public void setObjInternCode(ArrayList<CodeContextLine> objInternCode) {
        this.objInternCode = objInternCode;
    }    
}